package com.bestcem.xm.txtanls.dao;

import com.bestcem.xm.txtanls.entity.pojo.TopicDO;
import com.bestcem.xm.txtanls.entity.pojo.TopicGroupInfoDO;

import java.util.List;
import java.util.Set;


/**
 * 话题表DAO 话题/话题组简写为话题
 *
 * @author liheng
 * @version v1.0
 * @date 2021/5/10-16:40
 */
public interface TopicDao {


    /**
     * 新增话题
     *
     * @param topicDO 话题实体，非空
     * @return 新增记录id
     * @author liheng
     */
    TopicDO saveTopic(TopicDO topicDO);


    /**
     * 新增话题
     *
     * @param projectId 项目id
     * @param name      话题名
     * @param groupId   话题组名
     * @param keywords  关键词
     * @return 新增实体
     * @author liheng
     */
    TopicDO insertTopic(String projectId, String name, String groupId, List<String> keywords);

    /**
     * 新增话题组
     *
     * @param projectId 项目id
     * @param name      话题组名
     * @return 新增实体
     */
    TopicDO insertGroup(String projectId, String name);


    /**
     * 根据id查实体详情
     *
     * @param id 话题id 非空，调用前请判空
     * @return 话题实体
     * @author liheng
     */
    TopicDO getById(String id);

    /**
     * 新增默认话题组
     *
     * @param projectId 文本分析项目id，非空，调用前判空
     * @return 默认话题组id
     * @author liheng
     */
    TopicDO createDefaultTopicGroup(String projectId);

    /**
     * 查询默认话题组id
     *
     * @param projectId 文本分析项目id，非空
     * @return 话题组id
     * @author liheng
     */
    TopicDO getDefaultTopicGroup(String projectId);

    /**
     * 根据类型查询话题list
     *
     * @param projectId 文本分析字段id
     * @param type      话题类型
     * @return 话题list
     * @author liheng
     */
    List<TopicDO> listTopicByType(String projectId, Integer type);

    /**
     * 查询关键词数量大于1的话题
     *
     * @param projectId 项目id
     * @return 话题list
     * @author liheng
     * @date 2021/6/28 15:45
     */
    List<TopicDO> listTopicByKeywordExist(String projectId);


    /**
     * 根据项目id查询出所有的Topic
     *
     * @param projectId 文本分析项目id
     * @return List<TopicEntity>
     * @author jy.zhao
     * @date 2021/5/17 10:08
     **/
    List<TopicDO> listTopicByProjectId(String projectId);

    /**
     * 根据话题组查询子话题
     *
     * @param topicGid 话题组id
     * @return List<TopicEntity>
     * @author jy.zhao
     * @date 2021/5/17 10:14
     **/
    List<TopicDO> listTopicByGid(String topicGid);

    /**
     * 删除分析项目下的全部话题
     *
     * @param projectId 项目id
     * @return The result of a delete operation
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/17 15:36
     */
    boolean deleteProjectAllTopic(String projectId);


    /**
     * 查询文本分析项目所有话题的关键词
     *
     * @param projectId
     * @return
     * @author liheng
     * @date 2021/5/24 17:29
     */
    Set<String> listTopicKeyword(String projectId);


    /**
     * 根据名称查话题和话题组
     *
     * @param projectId 文本分析项目id
     * @param name      名称
     * @return
     * @author liheng
     * @date 2021/5/20 13:50
     */
    long countByName(String projectId, String name);

    /**
     * 修改单个话题组下所有话题的话题组id
     *
     * @param oldGroupId 话题组id
     * @param newGroupId 新话题组id
     * @param projectId  文本分析项目id
     * @return
     */
    boolean updateTopicGIdByGId(String oldGroupId, String newGroupId, String projectId);

    /**
     * id删除话题
     *
     * @param id
     * @return
     * @author liheng
     * @date 2021/6/28 15:45
     */
    boolean deleteById(String id);

    /**
     * 修改话题名或关键词，关键词为覆盖修改
     *
     * @param id       话题id
     * @param name     话题名
     * @param keywords 关键词
     * @author liheng
     * @date 2021/5/24 16:58
     */
    boolean updateNameOrKeywords(String id, String name, List<String> keywords);

    /**
     * 修改话题关键词
     *
     * @param id       话题id
     * @param keywords 关键词list
     * @return 修改结果
     */
    boolean updateKeyword(String id, List<String> keywords);

    /**
     * 添加关键词
     *
     * @param id
     * @param name
     * @param keywords
     * @author liheng
     * @date 2021/5/24 17:06
     */
    void appendKeywords(String id, String name, List<String> keywords);

    /**
     * 修改话题的话题组id
     *
     * @param id
     * @param topicGroupId
     * @return
     * @author liheng
     * @date 2021/5/21 11:42
     */
    boolean updateGroupIdById(String id, String topicGroupId);


    /**
     * 查询项目中的话题组以及包含的话题
     *
     * @param projectId 文本分析项目id
     * @author liheng
     * @date 2021/5/21 11:42
     */
    List<TopicGroupInfoDO> aggregateTopic(String projectId);

    /**
     * 话题移动到默认话题组
     *
     * @param topicGId
     * @param projectId
     * @author liheng
     * @date 2021/5/25 10:03
     */
    boolean moveTopicToDefaultGroup(String topicGId, String projectId);

}
